package cn.cimoc.mapper;

import cn.cimoc.model.User;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;

import java.util.List;

//Mybatis会根据这个接口 生成 实现类
@Repository
public interface UserMapper {

    //当前方法 需要指定 返回值类型(查询数据结果类型) 和  方法名
    //@Select注解表示要执行查询操作，注解的()里面写的要执行的sql语句
    @Select("select username from t_user where id=10")
    String getUsernameById();

    //如果条件是可变的，需要使用#{xx}来占位，xx位置内容可变的
    //实际开发中查询尽量避免使用*

    //保证数据库中的列名和 User类中的属性名 完全一致
    //底层实际上是调用User类的set方法实现的。
    //例如查询出了数据库中的id列，就会id--Id--setId调用User对象的setId()方法，将id列查询的值注入到User对象的id属性中
    //以此类推 User对象的所有属性就有值了

    //sql语句中有几个占位符，就需要给抽象方法传入几个参数，一般占位符中的内容 作为 参数名称
    @Select("select id,username,password,age,phone,email from t_user where id=#{id}")
    User getUserById(Integer id);

    //底层是 将 每一行数据封装到User对象中，再将user对象添加到list集合中
    @Select("select id,username,password,age,phone,email from t_user")
    List<User> getUsers();

    //方法的参数user对象中 #{}占位符的内容 和 属性名称 保持一致
    //底层会调用user对象的get方法 为#{}赋值
    //例如 #{username}就会调用user对象的getUsername方法 从而获得user对象的username属性值

    //useGeneratedKeys = true表示要获得生成的主键
    //keyProperty = "id" 表示当前user对象对应主键的属性是id
    @Insert("insert into t_user values(null,#{username}," +
            "#{password},#{age},#{phone},#{email})")
    @Options(useGeneratedKeys = true,keyProperty = "id")
    Integer insertUser(User user);

    //当项目没有使用springboot来搭建时，我们就需要使用@Param主键来实现绑定关系：参数 和 占位符
    @Update("update t_user set password=#{password} where id=#{id}")
    Integer updatePassword(String password,Integer id);

}
